home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
develop
/
symcoff.arc
/
SYMCOFF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-05-11
|
5KB
|
238 lines
#ifndef PCPORT
#define PCPORT
#endif
#include <dos.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "pcport.h"
#include "par.h"
#include "pfilehdr.h"
#include "pldfcn.h"
#include "paouthdr.h"
#include "pscnhdr.h"
#include "psyms.h"
#include "pstrclss.h"
#include "pldf_dcl.h"
/*
#define FILE struct _iobuf
extern FILE {
char *_ptr;
int _cnt;
char *_base;
char _flag;
char _file;
} _NEAR _CDECL _iob[];
*/
short cds8 = 0;
extern int pldaclose(register LDFILE *);
extern LDFILE *pcldopen (char *, LDFILE *);
int do_symbol(SYMENT *, char *);
extern char *basenam (char *);
int gensym(char *);
short
main(argc,argv)
short argc;
char *argv[ ];
{
char * s;
char nami[_MAX_FNAME];
while (--argc > 0 &&(*++argv)[0] == '-')
{
for (s = argv[0]+1; *s != '\0'; ++s)
{
switch (*s)
{
case 'c':
cds8 = 1;
break;
default:
printf("illegal option %c\n", *s);
argc = -1;
break;
}
}
}
if (argc < 0)
{
printf("Usage: symcoff [-c] [files ...]\n");
exit(-1);
}
else if (argc == 0)
{
while ((gets(nami))!=NULL)
{
if (nami[0]=='\0')
{
/*
** skip empty input line
*/
continue;
}
gensym(nami);
}
printf("All files processed\n");
}
else
{
while ((argc--) > 0)
{
gensym(*argv);
argv++;
}
}
return(0);
}
int
gensym(nami)
char *nami;
{
FILE *fip, *fop;
LDFILE *ldptr = 0L;
SYMENT symbuf;
AUXENT auxbuf;
char outbuf[100];
char namo[_MAX_FNAME];
int i,j;
/* Open one input COFF and output file*/
ldptr = (LDFILE *)0L;
if ((ldptr=pcldopen(nami,ldptr))==NULL) return(FAILURE);
fip = IOPTR(ldptr);
strcpy(namo,nami);
for (i=strlen(namo)-1; i>0 && namo[i] != '\.'; i--);
if (i>0) namo[i] = '\0';
fop = fopen(strcat(namo,"\.sym"),"wb");
/*fread(&HEADER(nldptr), FILHSZ, 1, IOPTR(ldptr));*/
/* Seek to beginning of symbol table */
if(HEADER(ldptr).f_symptr == 0L) return(FAILURE);
if(fseek(IOPTR(ldptr),(long)(OFFSET(ldptr)+HEADER(ldptr).f_symptr),0)
!= 0) return(FAILURE);
/* Retrieve symbols, skip aux records */
for (i=0; i<HEADER(ldptr).f_nsyms; i++) {
fread(&symbuf, SYMESZ, 1, IOPTR(ldptr));
for (j=0; j < (int)symbuf.n_numaux; j++, i++) /*i++ ??*/
fread(&auxbuf, AUXESZ, 1, IOPTR(ldptr));
if (do_symbol(&symbuf, outbuf))
fputs(outbuf,fop);
}
fclose(fip);
fclose(fop);
return(SUCCESS);
}
LDFILE *pcldopen(filename, ldptr)
char *filename;
LDFILE *ldptr;
{
char line[sizeof(ARMAG)];
register long disp;
long ftell();
struct ar_hdr ar_head;
register LDFILE *nldptr;
if(ldptr==0) {
if((nldptr=(LDFILE *) pldallocptr()) == FAILURE) return(NULL);
if((IOPTR(nldptr) = fopen(filename, "rb")) == NULL) return(NULL);
if(fread(line, sizeof(ARMAG), 1, IOPTR(nldptr)) != 1) return(NULL);
if(strnicmp(line, ARMAG, sizeof(ARMAG) - 1) != 0) {
/* non-archive format, regular coff */
fseek(IOPTR(nldptr), 0L, 0);
OFFSET(nldptr) = 0L;
TYPE(nldptr) = 1;
}
else {
/* archive format */
TYPE(nldptr) = PLDARMAG;
OFFSET(nldptr) = sizeof(ARMAG) + sizeof(struct ar_hdr) - 1;
disp = _fpldahread(nldptr) + OFFSET(nldptr) + sizeof(struct ar_hdr);
fseek(IOPTR(nldptr), disp, 0);
OFFSET(nldptr) = ftell(IOPTR(nldptr));
}
fread(&HEADER(nldptr), FILHSZ, 1, IOPTR(nldptr));
return(nldptr);
}
else { /*(ldptr != 0)*/
if(fread(&HEADER(ldptr), FILHSZ, 1, IOPTR(ldptr)) != 1) return(NULL);
return(ldptr);
}
}
int
do_symbol(symptr, outbuf)
SYMENT *symptr;
char outbuf[];
{
short i;
char c;
/* filter: .bf .ef etc */
/* relocate n_value using sec. number and other info */
/* returns 0 if do not output */
if (cds8)
{
if (!iscsymf(symptr->n_name[0]))
{
return(0);
}
for (i = 1; i < 8; ++i)
{
if ((c = symptr->n_name[i]) == '\0')
{
break;
}
if (!iscsym(c))
{
return(0);
}
}
sprintf(outbuf, "define %8.8s %#.4lx\n\0",
symptr->n_name, symptr->n_value);
}
else
{
sprintf(outbuf, " @LS %s %#.8lX\n\0",
symptr->n_name, symptr->n_value);
printf( " @LS %s %#.8lX \(%hd\) aux:%hd\n",
symptr->n_name, symptr->n_value,
symptr->n_scnum, (short)symptr->n_numaux);
}
return(1);
}
char * basenam(fullnam)
char * fullnam;
{
char *p;
p = fullnam + strlen(fullnam);
while (*(p-1)!='\\' && p>fullnam) p--;
return (p);
}